var createError = require('http-errors');
var express = require('express');
var path = require('path');
var fs = require('fs/promises');
var cookieParser = require('cookie-parser');
var lessMiddleware = require('less-middleware');
var logger = require('morgan');

var formidableMiddleware = require('express-formidable');

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var flash = require('connect-flash'); // 提示效果 

var config = require('./config')

const routes = require('./routes');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
// app.use(express.urlencoded({
//   extended: false
// })); // 解析post
app.use(cookieParser());
app.use(lessMiddleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

app.use(formidableMiddleware({
  encoding: 'utf-8', // 编码格式
  uploadDir: path.join(__dirname, 'public/upload'), // 设定文件上传的路径
  multiples: true, // 允许多文件上传
  keepExtensions: true // 保留上传文件的后缀名
}, [{
  event: 'file', // 文件事件，每次接受了一个文件就会触发这个事件  用这个事件来解决 用户没有上传图片仍然会有空文件保存的bug
  action: function (req, res, next, name, file) {
    console.log('file事件被触发');
    if (file && file.size === 0) { // 如果发现文件存在 且文件的size大小为0就把文件删掉
      // 删除文件 fs.unlink
      fs.unlink(file.path).then().catch(err => next(err))
    }
  }
}]))

app.use(session({
  name: config.session.key, // 设置 cookie 中保存 session id 的字段名称
  secret: config.session.secret, // 通过设置 secret 来计算 hash 值并放在 cookie 中，使产生的 signedCookie 防篡改
  resave: false, // 强制更新 session
  saveUninitialized: false, // 设置为 false
  cookie: {
    maxAge: config.session.maxAge // 过期时间，过期后 cookie 中的 session id 自动删除
  },
  store: new MongoStore({ // 将 session 存储到 mongodb
    url: `${config.db.url}/${config.db.name}` // mongodb的url和储存的数据库
  })
}));
// app.use('/', indexRouter);
// app.use('/users', usersRouter);

app.use(flash())

// 所有的模板都可以访问到locals中的数据，相当于网络的全局变量
app.locals.site = {
  name: config.site.name
}

app.use((req, res, next) => {
  req.body = {
    ...req.body,
    ...req.fields
  }

  // authUser 认证用户
  res.locals.authUser = req.session.user;
  // flash只写一个参数代表从flash 存储中读取数据
  res.locals.alertSuccess = req.flash('success');
  res.locals.alertError = req.flash('error');
  next()
})

routes(app);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404, '您请求的页面不存在！'));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};
  res.locals.title = err.message

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;